
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>JPA的查询语言（JPQL）与原生SQL的区别与使用场景 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>JPA的查询语言（JPQL）与原生SQL的区别与使用场景 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">JPQL的核心思想是什么？它查询的对象与原生SQL有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">JPQL（Java Persistence Query Language）是一种面向对象的查询语言，它查询的对象是Java实体（Entity），而不是数据库表。这是它与直接查询数据库表的原生SQL最根本的不同。</div>
          </div>
          <div class="card-source">来源: 一、什么是JPQL？ -> 1.1 JPQL的定义</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">相较于原生SQL，JPQL在数据库可移植性方面有什么优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">JPQL具备数据库无关性。它能够屏蔽不同数据库供应商之间SQL语法的差异，使得代码能够在多种数据库上运行，从而具有更强的可移植性。</div>
          </div>
          <div class="card-source">来源: 一、什么是JPQL？ -> 1.2 JPQL的特点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在使用JPA的`@Query`注解时，如何指明要执行的是原生SQL查询而非JPQL？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在`@Query`注解中，通过将`nativeQuery`属性设置为`true`来表明该查询是原生SQL。例如：`@Query(value = "SELECT * FROM users WHERE name = :name", nativeQuery = true)`。</div>
          </div>
          <div class="card-source">来源: 二、什么是原生SQL？ -> 2.3.1 基本查询</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">JPQL和原生SQL在处理实体间的关联查询时，语法上有何主要区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">JPQL可以直接使用实体对象的关系映射来导航和查询，例如 `JOIN o.customer c`，这是面向对象的写法。而原生SQL则需要显式地使用数据库表的 `JOIN` 关键字，并写明表之间的关联条件，例如 `JOIN customers c ON o.customer_id = c.id`。</div>
          </div>
          <div class="card-source">来源: 一、什么是JPQL？ -> 1.3.2 关联查询 & 二、什么是原生SQL？ -> 2.3.2 复杂查询</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在哪些具体场景下，使用原生SQL会比JPQL更合适？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当需要使用数据库特有的功能（如JSON查询、全文搜索）、需要进行高性能优化（如使用索引提示）或执行非常复杂的查询（如存储过程、大量子查询、UNION查询）时，原生SQL是更合适的选择。</div>
          </div>
          <div class="card-source">来源: 五、什么时候使用原生SQL？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">根据文档，JPQL和原生SQL在查询目标和对数据库的依赖性上有何核心差异？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">核心差异在于：1. 查询目标：JPQL的查询目标是JPA实体对象，而原生SQL是数据库表。2. 数据库依赖性：JPQL具备数据库无关性，可移植性强；原生SQL则依赖于特定数据库的语法。</div>
          </div>
          <div class="card-source">来源: 三、JPQL与原生SQL的区别</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">对于常规的业务查询和需要跨数据库平台部署的项目，为什么推荐使用JPQL？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为对于常规业务查询，JPQL更符合JPA的面向对象设计理念，能减少开发成本。同时，它的数据库无关性可以减少对特定数据库语法的依赖，从而增强项目的可移植性，这对于需要支持多个数据库的项目至关重要。</div>
          </div>
          <div class="card-source">来源: 四、什么时候使用JPQL？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">原生SQL能够利用哪些数据库特定功能来处理JPQL无法满足的需求？请举例说明。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">原生SQL可以利用数据库特有的函数和语法，例如使用`json_extract()`进行JSON查询，或使用`/*+ INDEX(...) */`这样的提示来强制数据库使用特定索引进行性能优化，这些都是标准JPQL无法做到的。</div>
          </div>
          <div class="card-source">来源: 五、什么时候使用原生SQL？ -> 5.1 需要数据库特有的功能 & 5.2 执行高性能优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">原生SQL适用于哪些JPQL难以实现的复杂查询场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">原生SQL适用于JPQL难以实现的复杂查询场景，例如涉及多个表的`UNION`查询、大量的子查询、或者调用数据库的存储过程等。</div>
          </div>
          <div class="card-source">来源: 五、什么时候使用原生SQL？ -> 5.3 执行复杂查询</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
